[모바일 해킹 연습] Fridalab1 ~ 8 풀이

[모바일 해킹 연습] Fridalab1 ~ 8 풀이

Lecture
Security
태그
frida
fridalab
mobile hacking
public
완성
Y
생성일
Mar 18, 2024 05:48 AM
LectureName
Mobile Hacking (Android - Frida )

1. FridaLab


1.1 설명

FridaLab은 프리다를 연습할 수 있도록 Ross Marks라는 사람이 만든 앱 입니다.
총 8개의 문제로 구성되어 있는데, 간단한 변수 조작, 후킹, View 조작 등 Frida “자체” 를 연습하기에는 매우 좋은 apk라고 생각합니다.
 
 

1.2 다운로드

해당 웹사이트에서 다운로드 할 수 있습니다.
 
 
 

2. 실습


2.1 환경 구축

※ 루팅에 대한 글은 따로 다루지 않습니다. 루팅을 진행한 상태로 구축 바랍니다.
 
➡️ Frida 환경 설정
Frida란? / Frida 환경설정
< 참고 하시면 됩니다.
 
➡️ FridaLab.apk 다운로드
에뮬레이터 or 디바이스에 fridalab.apk를 다운로드합니다.
adb install <fridalab.apk 경로>
 
 

2.2 풀이

FridaLab의 경우에는 Frida를 사용하는 것 에 중심을 두었기 때문에, 다양한 풀이가 존재합니다.
따라서 2024/03/02 기준으로 동작하는 제 풀이만 공개해 두었습니다.
 
추가적으로 한번에 풀 수 있는 방법도 있지만, 만든 사람이 그걸 의도한 것은 아닐 것 같기 때문에 정석대로 푸는 것을 추천 드립니다.
 
01
setImmediate(function(){ Java.perform(function(){ // challenge_01 클래스 사용 let chall01Class = Java.use("uk.rossmarks.fridalab.challenge_01") // 값 조작 chall01Class.chall01.value = 1 }) })
 
 
02
setImmediate(function(){ Java.perform(function(){ // 실행된 MainActivity 인스턴스 attach Java.choose("uk.rossmarks.fridalab.MainActivity", { onMatch : function(MainActivity) { // 메서드 실행 MainActivity.chall02() }, onComplete : function () { } }) }) })
 
 
03
setImmediate(function(){ Java.perform(function(){ // 실행된 MainActivity 인스턴스 attach Java.choose("uk.rossmarks.fridalab.MainActivity", { onMatch : function(MainActivity) { // 함수를 재 작성함 (implementation) MainActivity.chall03.implementation = function() { return true; } }, onComplete : function () { } }) }) })
 
 
04
setImmediate(function(){ Java.perform(function(){ // 실행된 MainActivity 인스턴스 attach Java.choose("uk.rossmarks.fridalab.MainActivity", { onMatch : function(MainActivity) { // MainActivity의 chall4 method를 실행할 때, "frida" 인자를 같이 넘겨줌 MainActivity.chall04("frida") }, onComplete : function () { } }) }) })
 
 
05
setImmediate(function(){ Java.perform(function(){ Java.choose("uk.rossmarks.fridalab.MainActivity", { onMatch : function(MainActivity) { // 함수 재작성 MainActivity.chall05.implementation = function (data) { // 정답 배열을 가져온 후, 5번문제에 해당하는 5번째 index를 변경 let completeArr = this.completeArr.value; completeArr[4] = 1; // 변경 후 저장. this.completeArr.value = completeArr; } }, onComplete : function () { } }) }) })
 
 
06
// 문제를 확인해 보면, 어플리케이션이 실행되고, 10초 뒤에 값을 보내라고 되어 있습니다. setTimeout(() => { setImmediate(function(){ Java.perform(function () { // challenge_06 class 사용 const chall06Class = Java.use("uk.rossmarks.fridalab.challenge_06"); // addChall06 method를 사용하여 chall6의 값을 반드시 9000 이상이 되도록 설정 chall06Class.addChall06(9001) // 설정된 값을 check 함수에 넘겨줘야 하기 때문에 추출 let chall06 = chall06Class.chall06.value Java.choose("uk.rossmarks.fridalab.MainActivity", { onMatch : function(instance) { // 값과 함께 함수 호출 및 인자 전달 instance.chall06(chall06) }, onComplete : function() { } }) }) }) }, 10000);
 
 
07
//bf 할필요가 전혀 없지만... 하라니깐 해보겠습니다. setImmediate(function(){ Java.perform(function(){ let chall01Class = Java.use("uk.rossmarks.fridalab.challenge_07") // chall07 value set 1000~10000 chall01Class.setChall07() // start point will be "1000" let check = "1000" console.log("[+] broute forcing...") while (!chall01Class.check07Pin(check)) { // +1 check = String(Number(check) + 1); } //bf success! console.log("[!] pin is : " + check) //call the MainActivity.chall7 and get the flag! yeah Java.choose("uk.rossmarks.fridalab.MainActivity", { onMatch : function(instance) { instance.chall07(check); }, onComplete : function() {} }) }) })
 
 
08
setImmediate(function() { Java.perform(function() { // 안드로이드 위젯인 버튼을 가져옴 var btn = Java.use("android.widget.Button"); Java.choose("uk.rossmarks.fridalab.MainActivity", { onMatch: function(instance) { // CHECK가 저장되어 있는 ViewId로 접근 var btnId = instance.findViewById(2131165231); // 형변환 var checkBtn = Java.cast(btnId, btn); // 버튼 안에 있는 값 변경 var stringClass = Java.use("java.lang.String"); checkBtn.setText(stringClass.$new("Hacked")) }, onComplete : function() {} }) }) })
 
 
여기까지 FridaLab의 풀이였습니다.